

<!doctype html>
<html>
<head>
	<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
	<script src="http://code.jquery.com/jquery-latest.js"></script>
	<title></title>
</head>
<body>

<button id="test1">$.queue</button>
<button id="test2">模拟queue</button>
<button id="test3">$.dequeue</button>
<button id="test4">模拟dequeue</button>
<ul></ul>

<script type="text/javascript">
	
/**
 * 显示或操作匹配的元素上已经执行的函数列队。
 */
function queue(elem, type, data) {
	var queue;

	if (elem) {
		type = (type || "fx") + "queue";
		//获取队列数据
		//data_priv.get(elem, type);
		queue = $(elem).data(type);
		// 如果传递了数据，这存在缓存中
		if (data) {
			if (!queue || jQuery.isArray(data)) {
				//data_priv.access
				queue = $.data(elem, type, jQuery.makeArray(data))
			} else {
				queue.push(data);
			}
		}
		return queue || [];
	}
}

function dequeue(elem, type) {
	type = type || "fx";

	//取出队列
	var queue = jQuery.queue(elem, type),
		startLength = queue.length,
		//取出第一个队列
		fn = queue.shift(),
		hooks = jQuery._queueHooks(elem, type),
		next = function() {
			jQuery.dequeue(elem, type);
		};

	// If the fx queue is dequeued, always remove the progress sentinel
	if (fn === "inprogress") {
		fn = queue.shift();
		startLength--;
	}

	if (fn) {

		// Add a progress sentinel to prevent the fx queue from being
		// automatically dequeued
		// 如果开始执行，就需要加一个进程锁
		// 如果是dequeue操作, 去掉锁, 执行队列里的函数, 同时给队列加上锁. 
		// 如果是queue操作, 要看锁的状态, 如果被锁上了, 就只执行队列的添加操作. 不再调用dequeue. 
		if (type === "fx") {
			queue.unshift("inprogress");
		}

		// clear up the last queue stop function
		delete hooks.stop;
		fn.call(elem, next, hooks);
	}

	if (!startLength && hooks) {
		hooks.empty.fire();
	}
}



var body = $('body')[0];

function cb1() {
	alert(1)
}

function cb2() {
	alert(2)
}


function clear(){
	$('body').removeData();
}

$("#test1").click(function() {
	$.queue(body, 'aa', cb1); 
	$.queue(body, 'aa', cb2);
	alert($.queue(body, 'aa'))
})

$("#test2").click(function() {
	clear()
	queue(body, 'aa', cb1); 
	queue(body, 'aa', cb2);
	alert(queue(body, 'aa'))
})
$("#test3").click(function() {
	//set
	$.queue(body, 'aa', cb1); // 第三个参数为function
	$.queue(body, 'aa', cb2);
	alert($.dequeue(body, 'aa')) //11
	alert($.dequeue(body, 'aa')) //11
})

$("#test4").click(function() {
	show(ajaxConvertXML(xml))
})





</script>
</body>
</html>